package designPattern.singleton;

/**
 * 优化 synchronized 重量级锁
 * 通过双重检查 解决上一个版本的并发问题
 * 例1    int m = 8 ;      正常字节码是 先 new 出空间 （半初始化） 赋值 8   之后 m 变量指向 new出来的空间
 * 如果指令重排   new出空间后   m变量先执行 new出来的空间   这时候有人m 会发现  m可用并且 值为0
 */
public class singleton05 {
     //加volatile 防止指令重排序           美团面试：DLC（double check lock）需不需要volatile?    例1
    private static volatile singleton05 INSTANCE;

    private singleton05() {
    }

    public static singleton05 getInstance(){
        if (INSTANCE == null) {
            //双重检查 解决并发问题
            synchronized (singleton05.class) {
                if (INSTANCE == null) {
                    try {
                        Thread.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    INSTANCE = new singleton05();
                }
            }
        }
        return INSTANCE;
    }

    public void k(){
        System.out.println("OK");
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread( ()-> System.out.println(singleton05.getInstance().hashCode())).start();
        }
    }
}
